package es.antonio.duarte.abrahamAdmin.servicios;

import java.io.OutputStream;
import java.util.Date;
import java.util.Locale;

import es.antonio.duarte.abrahamAdmin.model.Diario;
import es.antonio.duarte.abrahamAdmin.servicios.informes.Informe;

/**
 * Implementacion del servicio de generacion de informes de la plantilla.
 * @author Antonio Duarte
 */
public class InformeServicioImpl implements InformeServicio {

   /**
    * Servicio para Diario.
    */
   private DiarioServicio diarioServicio;
   
   /**
    * Clase report para el informe de los diarios a generar.
    */
   private Informe informeDiario;

   /**
    * Genera el informe de todos los diarios.
    * Genera el informe donde le indiquemos.
    * @param locale Locale para el informe.
    */
   public final void generaInformeDiario(final Locale locale) {
      informeDiario.setJrDataSource(diarioServicio.consultar(Diario.class));
      informeDiario.setLocale(locale);
      informeDiario.generar();
   }

   /**
    * Genera el informe de todos los diario.
    * @param outStr flujo de salida en el que se escribe el fichero generado.
    * Este parámetro se le pasa ya creado y la responsabilidad de
    * cerrarlo es del que lo ha creado.
    * @param locale Locale para el informe.
    */
   public final void generaInformeMensaje(OutputStream outStr,
                                                       final Locale locale) {
	   informeDiario.setJrDataSource(diarioServicio.consultar(Diario.class));
	   informeDiario.setLocale(locale);
	   informeDiario.generar(outStr);
   }

   /**
    * Genera el informe de todos los diarios.
    * @param locale Locale para el informe.
    * @return informe en forma de array de bytes
    */
   public final byte[] generaInformeDiarioEnBytes(final Locale locale) {
	   informeDiario.setJrDataSource(diarioServicio.consultar(Diario.class));
	   informeDiario.setLocale(locale);
      return informeDiario.generarEnBytes();
   }

   
   /**
    * Genera el informe de todos los diarios con tal titulo.
    * Genera el informe donde le indiquemos.
    * @param titulo Titulo a buscar
    * @param locale Locale para el informe.
    */
   public final void generaInformeDiarioPorTitulo(final String titulo,
                                                       final Locale locale) {
	   informeDiario.setJrDataSource(
                              diarioServicio.consultarPorTitulo(titulo));
	   informeDiario.setLocale(locale);
	   informeDiario.generar();
   }

   
   /**
    * Genera el informe de todos los diarios con tal titulo.
    * @param titulo Titulo a buscar
    * @param locale Locale para el informe.
    * @return informe en forma de array de bytes
    */
   public final byte[] generaInformeDiarioPorTituloEnBytes(
                               final String titulo, final Locale locale) {
       informeDiario.setJrDataSource(
                               diarioServicio.consultarPorTitulo(titulo));
       informeDiario.setLocale(locale);
       return informeDiario.generarEnBytes();
   }

    /**
     * Genera el informe de todos los diarios con tal fecha.
     * Genera el informe donde le indiquemos.
     * @param fecha a buscar
     * @param locale Locale para el informe.
     */
    public final void generaInformeDiarioPorFecha(final Date fecha,
                                                        final Locale locale) {
       informeDiario.setJrDataSource(
                                   diarioServicio.consultarPorFecha(fecha));
       informeDiario.setLocale(locale);
       informeDiario.generar();
    }

    /**
     * Genera el informe de todos los diarios con tal fecha.
     * @param fecha a buscar
     * @param outStr flujo de salida en el que se escribe el fichero generado.
     * Este parámetro se le pasa ya creado y la responsabilidad de
     * cerrarlo es del que lo ha creado.
     * @param locale Locale para el informe.
     */
    public final void generaInformeMensajePorFecha(final Date fecha,
                                     OutputStream outStr, final Locale locale) {
       informeDiario.setJrDataSource(
                                   diarioServicio.consultarPorFecha(fecha));
       informeDiario.setLocale(locale);
       informeDiario.generar(outStr);
    }

    /**
     * Genera el informe de todos los mensajes con tal fecha.
     * @param fecha a buscar
     * @param locale Locale para el informe.
     * @return informe en forma de array de bytes
     */
     public final byte[] generaInformeDiarioPorFechaEnBytes(final Date fecha,
                                                         final Locale locale) {
    	 informeDiario.setJrDataSource(
                                     diarioServicio.consultarPorFecha(fecha));
    	 informeDiario.setLocale(locale);
         return informeDiario.generarEnBytes();
     }

    /**
     * Obtiene el servicio de diario.
     * @return Servicio de diario.
     */
    public final DiarioServicio getDiarioServicio() {
       return diarioServicio;
    }

    /**
     * Modifica el servicio de diarios.
     * @param newMsjServicio nuevo Servicio de diario.
     */
    public final void setDiarioServicio(
                                        final DiarioServicio newMsjServicio) {
       this.diarioServicio = newMsjServicio;
    }

    
    /**
     * Obtiene el informe de diarios.
     * @return informeDiario informe de diarios
     */
    public final Informe getInformeDiario() {
       return informeDiario;
    }

    /**
     * Modifica el informe de diario.
     * @param newInformeDiario informe para diario
     */
    public final void setInformeDiario(final Informe newInformeDiario) {
       this.informeDiario = newInformeDiario;
    }


	public void generaInformeDiario(OutputStream outStr, Locale locale) {		
		informeDiario.setJrDataSource(diarioServicio.consultar(Diario.class));
		informeDiario.setLocale(locale);
		informeDiario.generar(outStr);
	}
		

	public void generaInformeDiarioPorFecha(Date fecha, OutputStream outStr,
			Locale locale) {
		informeDiario.setJrDataSource(diarioServicio.consultarPorFecha(fecha));
		informeDiario.setLocale(locale);
		informeDiario.generar(outStr);
	}

	public void generaInformeDiarioPorTitulo(String titulo,
			OutputStream outStr, Locale locale) {
		informeDiario.setJrDataSource(diarioServicio.consultarPorTitulo(titulo));
		informeDiario.setLocale(locale);
		informeDiario.generar(outStr);
		
	}

	public byte[] generaInformeMensajePorTituloEnBytes(String titulo,
			Locale locale) {
		informeDiario.setJrDataSource(diarioServicio.consultarPorTitulo(titulo));
		informeDiario.setLocale(locale);
		return informeDiario.generarEnBytes();
	}
}
